home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
351-375
/
disk_351
/
pdc
/
libsrc.lzh
/
LibSrc
/
StdLib
/
system.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-04-19
|
5KB
|
228 lines
/*
* Libraries and headers for PDC release 3.3 (C) 1989 Lionel Hummel.
* PDC Software Distribution (C) 1989 Lionel Hummel and Paul Petersen.
* PDC I/O Library (C) 1987 by J.A. Lydiatt.
*
* This code is freely redistributable upon the conditions that this
* notice remains intact and that modified versions of this file not
* be included as part of the PDC Software Distribution without the
* express consent of the copyright holders. No warrantee of any
* kind is provided with this code. For further information, contact:
*
* PDC Software Distribution Internet: BIX:
* P.O. Box 4006 or hummel@cs.uiuc.edu lhummel
* Urbana, IL 61801-8801 petersen@uicsrd.csrd.uiuc.edu
*/
/* system.c
*
* system() - Executes a program within the context of the current process
* _PathAccess() - Attempts access of file along a trial path
*
* Note: The following two routines are a non-optimal solution to the
* need to find the full path name given only a directory lock.
*
* _SearchPath() - Attempts to locate a file along the current CLI path
*/
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/alerts.h>
#include <libraries/dosextens.h>
#include <ctype.h>
#define MAXPATH (1024L)
extern long LoadSeg();
extern void UnLoadSeg();
char *_SearchPath();
char *_PathAccess();
int system(line)
char *line;
{
char *buffer;
char *command;
char *args;
char *ptr;
char scan_for;
long segment_list;
long return_code;
buffer = malloc(strlen(line)+1+3+1); /* null + space to LW align + LF */
if (!(ptr = buffer)) {
Alert(AG_NoMemory, 0L);
return(-1);
}
while (isspace(*line))
line++;
if (*line == '"') {
scan_for = '"';
line++;
}
else
scan_for = ' ';
while (*ptr = *line) {
if ((isspace(*line) && (scan_for == ' ')) || (*line == scan_for))
break;
else {
ptr++;
line++;
}
}
*ptr++ = '\0';
args = ptr = (ptr+3) & 0xfffffffc; /* Longword align */
while (isspace(*line))
line++;
while (*ptr = *line)
ptr++, line++;
*ptr++ = '\n';
*ptr++ = '\0';
command = _SearchPath(buffer);
if (!command) {
free(buffer);
return(-1);
}
segment_list = LoadSeg(command);
if (!segment_list) {
free(buffer);
free(command);
return(-1);
}
return_code = System0(command, segment_list, args);
UnLoadSeg(segment_list);
free(buffer);
free(command);
return(return_code);
}
char *_SearchPath(target)
char *target;
{
struct CommandLineInterface *this_cli;
struct FileLock *pl;
struct FileLock *nextpl;
struct FileInfoBlock *fib;
char *fullpath = 0L;
char *buffer;
struct {
BPTR NextPath;
BPTR PathLock;
} *p_chain;
unsigned int count;
/* Check current directory:
*/
fullpath = _PathAccess("", target);
if (fullpath)
return(fullpath);
/* Then check search path:
*/
this_cli = BADDR(((struct Process *)FindTask(0L))->pr_CLI);
if (this_cli == 0L) {
return(0L);
}
p_chain = BADDR(this_cli->cli_CommandDir);
buffer = malloc(MAXPATH+2); /* Path + nul + initial slosh byte */
if (buffer == 0L) {
Alert(AG_NoMemory, 0L);
return(0L);
}
fib = malloc(sizeof(struct FileInfoBlock));
if (!fib) {
Alert(AG_NoMemory, 0L);
return(0L);
}
while (p_chain) {
pl = DupLock(p_chain->PathLock);
buffer[MAXPATH+1] = '\0';
fullpath = &buffer[MAXPATH];
while (pl) {
if (Examine(pl, fib)) {
if (nextpl = ParentDir(pl))
*--fullpath = '/';
else
*--fullpath = ':';
fullpath -= (count = strlen(fib->fib_FileName));
if (fullpath <= buffer) {
UnLock(pl);
if (nextpl)
UnLock(nextpl);
goto next_path;
}
bcopy( fib->fib_FileName, fullpath, count );
UnLock(pl);
pl = nextpl;
}
else {
UnLock(pl);
goto next_path;
}
}
fullpath = _PathAccess(fullpath, target);
if (fullpath) {
UnLock(nextpl);
free(buffer);
free(fib);
return(fullpath);
}
next_path:
p_chain = BADDR(p_chain->NextPath);
}
/* If that fails, default to c:
*/
fullpath = _PathAccess("c:", target);
free(buffer);
free(fib);
return(fullpath); /* Gets 0L from _PathAccess if failed */
}
char *_PathAccess(path, target)
char *path;
char *target;
{
char *buf;
struct FileLock *fl;
buf = malloc(1024);
if (buf == 0L) {
Alert(AG_NoMemory, 0L);
return(NULL);
}
buf[0] = '\0';
strcat(buf, path);
strcat(buf, target);
if (fl = Lock(buf, ACCESS_READ)) {
UnLock(fl);
return(buf);
}
free(buf);
return(0L);
}